package fr.miage.orleans.aar.modele;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(schema = Modele.SCHEMA_NAME)
public class Tournoi implements Serializable {

    @Id
    @GeneratedValue
    private int tournoiId;

    @Enumerated(EnumType.STRING)
    private EtatTournoi etatTournoi;

    @OneToMany(mappedBy = "tournoi", cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
    private Collection<MatchTour> matchs;

    @OneToMany(mappedBy = "tournoi", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
    private Collection<EquipeTournoi> equipesTournoi;

    private String nomTournoi;
    
    public Tournoi() {
        this.equipesTournoi = new HashSet<>();
        this.matchs = new HashSet<>();
    }

    public String getNomTournoi() {
        return nomTournoi;
    }

    public void setNomTournoi(String nomTournoi) {
        this.nomTournoi = nomTournoi;
    }

    public int getTournoiId() {
        return tournoiId;
    }

    public void setTournoiId(int tournoiId) {
        this.tournoiId = tournoiId;
    }

    public EtatTournoi getEtatTournoi() {
        return etatTournoi;
    }

    public void setEtatTournoi(EtatTournoi etatTournoi) {
        this.etatTournoi = etatTournoi;
    }

    /**
     * @return the equipesTournoi
     */
    public Collection<EquipeTournoi> getEquipesTournoi() {
        return equipesTournoi;
    }

    /**
     * @param equipesTournoi the equipesTournoi to set
     */
    public void setEquipesTournoi(Collection<EquipeTournoi> equipesTournoi) {
        this.equipesTournoi = equipesTournoi;
    }

    public boolean nombreEquipesPuissanceDe2() {
        int nombreEquipes = this.getEquipesTournoi().size();
        if (nombreEquipes <= 1) {
            return false;
        }
        return Integer.bitCount(nombreEquipes) == 1;
    }

    /**
     * @return the matchs
     */
    public Collection<MatchTour> getMatchs() {
        return matchs;
    }

    /**
     * @param matchs the matchs to set
     */
    public void setMatchs(Collection<MatchTour> matchs) {
        this.matchs = matchs;
    }

}
